package com.example.livemall.service.impl;

import com.example.livemall.dto.LzjResult;
import com.example.livemall.entity.ValidateCode;
import com.example.livemall.mapper.SendyzmMapper;
import com.example.livemall.service.SendyzmService;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.concurrent.ThreadLocalRandom;

/**
 * 验证码服务业务逻辑层
 */
@Slf4j
@Service
public class SendyzmServiceImpl implements SendyzmService {

    @Autowired
    private SendyzmMapper sendyzmMapper;

    /**
     * 发送验证码并保存 Redis
     *
     * @param phone
     * @return
     */
    @Override
    public LzjResult sendyzm(String phone) {
        // 获取验证码，判断是否已存在验证码
        ValidateCode oldCode = sendyzmMapper.getCode(phone);
        if (oldCode != null) {
            // 已有验证码，且有效。不生成新的验证码，直接通知客户，使用现有的验证码
            return LzjResult.error("原验证码仍然可用，请不要重复申请验证码！");
        }
        // 拼接一个长度为 4 的数字字符串。
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            buffer.append(ThreadLocalRandom.current().nextInt(10));
        }
        // 生成验证码。
        String code = buffer.toString();
        /*
            PS. 这里本应该要调用第三方短信服务进行短信发送，由于之前的项目已经练习过这里就简单实现了。
         */
        // 短信发送成功以后
        // 创建验证码对象
        ValidateCode validateCode = new ValidateCode();
        validateCode.setPhone(phone);
        validateCode.setCode(code);
        // 保存验证码到 Redis
        sendyzmMapper.setCode(validateCode.getPhone(), validateCode);
        // 返回结果
        LzjResult result = LzjResult.success("验证码发送成功");
        log.info("手机号码为【{}】，生成的验证码为【{}】", phone, code);
        return result;
    }


    /**
     * 根据手机号码获取验证码
     *
     * @param phone
     * @return
     */
    @Override
    public ValidateCode getCode(String phone) {
        return sendyzmMapper.getCode(phone);
    }

    /**
     * 删除验证码
     *
     * @param phone
     */
    @Override
    public LzjResult deleteCode(String phone) {
        boolean result = sendyzmMapper.deleteCode(phone);
        return result ? LzjResult.success("验证码删除成功") : LzjResult.error("验证码删除失败");
    }

}
